

/*! \file IAllocDistribution.hpp
    \brief Une interface permettant de manipuler plusieurs types de distribution via la meme abstraction. 
*/

#ifndef __IAllocDistribution__
#define __IAllocDistribution__

#include <cstdlib>
#include <iostream>


/**
 * \brief structure permettant la description d'un bloc de memoire. 
 */
typedef struct 
{
    /**
     *\brief taille du bloc. 
     */
	size_t taille;

    /**
     *\brief duree de vie du bloc. 
     */
	unsigned int duree_vie;

    /**
     * \brief identifiant du bloc. 
     */
	unsigned int id;
}chunk_desc;

/**
 * \class IAllocDistribution 
 * \brief Interface permettant de manipuler des distribution statistiques
 * d'allocations.
 */
class IAllocDistribution
{

protected:
  unsigned int id;
  chunk_desc bloc;


public:
  IAllocDistribution()
  {
    this->id=0;
  }
  
  /**
   * \brief Fournit une taille de bloc aleatoirement conforement a la
   * distribution utilisee.
   * Un appel a cette fonction permet de generer une taille de bloc.
   */
  inline size_t getBlocSize(unsigned int id)
  {
#ifdef DEBUG
    std::cout << "getSize () bloc n° " <<id<<std::endl;
#endif
    return bloc.taille;
  }
  
    
  /**
   * \brief Fournit une duree de vie conformement a la distribution.
   * Un appel a cette fonction permet de generer une duree de vie de bloc.
   */
  inline unsigned int getBlocLife(unsigned int id)
  {
#ifdef DEBUG
    std::cout << "getLife () bloc n° " <<id<<std::endl;
#endif
    return bloc.duree_vie;
  }
  
  
  
  /**
   * Un appel a cette fonction genere un bloc de memoire.
   */
  virtual void genererBloc(unsigned int id)=0;
  
  /**
   * \brief Initialise le generateur aleatoire avec une graine.
   * L' appel a cette fonction initialise le generateur utilise.
   */
  virtual void initGenerateur()=0;
  
  /**
   * \brief Finalise le le generateur utilisee.
   * L' appel a cette fonction libere les ressources.
   */
  virtual void finitGenerateur()=0;
  

  /**
   * \brief 
   * L'appel a cette fonction permet d'ecrire dans la mémoire allouee.
   */  
  virtual void writeBlocAt(unsigned int id){
#ifdef DEBUG
    std::cout << "Ecriture du bloc "<<id<<std::endl;
#endif
  }
  

  /**
   * Destructeur
   */
  virtual ~IAllocDistribution(){};
  
};
#endif
